package com.luisgutierrez.pds.ws;

import java.util.ArrayList;
import java.util.HashMap;

import org.orm.PersistentException;
import org.orm.PersistentTransaction;

import cl.luis.wsencriptacion.EncriptarDesencriptar;

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.luisgutierrez.pds.prueba2.*;
import com.luisgutierrez.pds.prueba2.dao.*;
import com.luisgutierrez.ws.GestionUsuarioORMWS;

/**
 * Esta clase permite crear el web service que ofrecera los servicio de consulta, agregacion y actualizacion de Pedidos
 * de la BD ademas de autentificacion de usuarios.
 * @author Renew21
 */
public class PedidosORMWS {
	
	/**
	 * Este metodo permite obtener la lista de todos los pedidos con sus datos correspondientes y existentes en la BD del servidor web.
	 * @return Retorna un String JSON encriptado.
	 */
	public String obtenerPedidos(){
		
		String resultJSON = "";
		ArrayList<HashMap<String, Object>> listPedidos = new ArrayList<HashMap<String,Object>>();

		DAOFactory lDAOFactory = DAOFactory.getDAOFactory();
		System.out.println("Listing Pedidos...");
		Pedido[] pedidos;
		try {
			pedidos = lDAOFactory.getPedidoDAO().listPedidoByQuery(null, null);
			int length = pedidos.length;
			System.out.println(length + " record(s) retrieved.");
			for (int i = 0; i < length; i++) {
				System.out.println(pedidos[i]);
				HashMap<String, Object> mapPedidos = new HashMap<String, Object>();
				mapPedidos.put("Id", pedidos[i].getIdPedido());
				mapPedidos.put("Mesa", pedidos[i].getMesa());
				mapPedidos.put("Detalle", pedidos[i].getDetalle());
				mapPedidos.put("Estado", pedidos[i].getEstado());
				listPedidos.add(mapPedidos);
			}

		} catch (PersistentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("Titulo", "Cartelera");
		map.put("Subtitulo", "Cartelera del cine");
		map.put("Fecha", "");
		map.put("Contenido", listPedidos);
		
		Gson gson = new Gson();
		
		resultJSON = EncriptarDesencriptar.encriptarCaracteres(gson.toJson(map));
		return resultJSON;
	}
	
	/**
	 * Este metodo permite obtener la lista de los pedidos pendientes con sus datos correspondientes y existentes en la BD del servidor web.
	 * @return Retorna un String JSON encriptado.
	 */
	public String obtenerPedidosPendientes(){
		
		String resultJSON = "";
		ArrayList<HashMap<String, Object>> listPedidos = new ArrayList<HashMap<String,Object>>();

		DAOFactory lDAOFactory = DAOFactory.getDAOFactory();
		System.out.println("Listing Pedidos...");
		Pedido[] pedidos;
		try {
			pedidos = lDAOFactory.getPedidoDAO().listPedidoByQuery(null, null);
			int length = pedidos.length;
			System.out.println(length + " record(s) retrieved.");
			for (int i = 0; i < length; i++) {
				
				if(pedidos[i].getEstado() == 0){
					System.out.println(pedidos[i]);
					HashMap<String, Object> mapPedidos = new HashMap<String, Object>();
					mapPedidos.put("Id", pedidos[i].getIdPedido());
					mapPedidos.put("Mesa", pedidos[i].getMesa());
					mapPedidos.put("Detalle", pedidos[i].getDetalle());
					mapPedidos.put("Estado", pedidos[i].getEstado());
					listPedidos.add(mapPedidos);
				}
			}

		} catch (PersistentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("Titulo", "Cartelera");
		map.put("Subtitulo", "Cartelera del cine");
		map.put("Fecha", "");
		map.put("Contenido", listPedidos);
		
		Gson gson = new Gson();
		resultJSON = EncriptarDesencriptar.encriptarCaracteres(gson.toJson(map));
		return resultJSON;
	}
	
	/**
	 * Este metodo permite agregar un pedido a la BD del servidor web.
	 * @param pedidoJson Recibe un String JSON encriptado.
	 * @return Retorna 1 si la agregacion del pedido fue exitosa o 0 en caso contrario.
	 */
	public int addPedido(String pedidoJson){
		int resultado = 0;
		//Se desencripta el JSON.
		pedidoJson = EncriptarDesencriptar.desencriptarCaracteres(pedidoJson);
		
		if(pedidoJson != null && !pedidoJson.isEmpty()){
			JsonParser jsonParser = new JsonParser();
			JsonObject pedido = jsonParser.parse(pedidoJson).getAsJsonObject();
			//Validar parametros recibidos no nulos
			System.out.println(pedidoJson);
			if(pedido.has("mesa") && pedido.has("detalle") && pedido.has("estado")){
				
				PersistentTransaction t = null;
				try {
					t = RestaurantPersistentManager.instance().getSession().beginTransaction();
					DAOFactory lDAOFactory = DAOFactory.getDAOFactory();
					
					
						Pedido nuevoPedido = new Pedido();
						nuevoPedido.setMesa(pedido.get("mesa").getAsString());
						nuevoPedido.setDetalle(pedido.get("detalle").getAsString());
						nuevoPedido.setEstado(pedido.get("estado").getAsInt());
						lDAOFactory.getPedidoDAO().save(nuevoPedido);
						resultado = 1;
					
					t.commit();
				} catch (PersistentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					try {
						t.rollback();
					} catch (PersistentException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
			}
		}
		return resultado;
	}
	
	/**
	 * Este metodo permite actualizar los datos de un pedido determinado existente en la BD del servidor web.
	 * @param pedidoJson Recibe un String JSON encriptado.
	 * @return Retorna 1 si la actualizacion del pedido fue exitosa o 0 en caso contrario.
	 */
	public int updatePedido(String pedidoJson){
		int resultado = 0;
		pedidoJson = EncriptarDesencriptar.desencriptarCaracteres(pedidoJson);
		
		if(pedidoJson != null && !pedidoJson.isEmpty()){
			JsonParser jsonParser = new JsonParser();
			JsonObject pedido = jsonParser.parse(pedidoJson).getAsJsonObject();
			//Validar parametros recibidos no nulos
			System.out.println(pedidoJson);
			if(pedido.has("id") && pedido.has("mesa") && pedido.has("detalle") && pedido.has("estado")){
				//Obtine Clasificacion y Genero
				PersistentTransaction t = null;
				try {
					t = RestaurantPersistentManager.instance().getSession().beginTransaction();
					DAOFactory lDAOFactory = DAOFactory.getDAOFactory();

					PedidoDAO pedidoDAO = lDAOFactory.getPedidoDAO();
					Pedido upPedido = pedidoDAO.loadPedidoByQuery("Pedido.idPedido = " + pedido.get("id").getAsInt(),null);

					upPedido.setEstado(pedido.get("id").getAsInt());
					upPedido.setMesa(pedido.get("mesa").getAsString());
					upPedido.setDetalle(pedido.get("detalle").getAsString());
					upPedido.setEstado(pedido.get("estado").getAsInt());
					pedidoDAO.save(upPedido);
					resultado = 1;
					
					t.commit();
				} catch (PersistentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					try {
						t.rollback();
					} catch (PersistentException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}finally{
					try {
						RestaurantPersistentManager.instance().getSession().flush();
						RestaurantPersistentManager.instance().disposePersistentManager();
					} catch (PersistentException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}

		System.out.println(resultado);
		return resultado;
	}
	
	/**
	 * Este metodo permite obtener la lista de todos los usuarios con sus datos correspondientes existentes en la BD del servidor.
	 * @return Retorna un String JSON encriptado.
	 */
	public String obtenerListaUsuarios(){
		String cadena = "";
		
		cadena = GestionUsuarioORMWS.obtenerListaUsuarios();
		cadena = EncriptarDesencriptar.encriptarCaracteres(cadena);
		return cadena;
	}
	
	/**
	 * Este metodo permite verificar si el usuario y contrasena del JSON recibido existen en la BD y si coincide completamente.
	 * @param usuarioJson Se recibe un String JSON.
	 * @return Se retorna 1 en caso de que exista el usuario y coincidan sus datos y 0 en caso contrario.
	 */
	public int verificarLogin(String usuarioJson){
		usuarioJson = EncriptarDesencriptar.desencriptarCaracteres(usuarioJson);
		
		return GestionUsuarioORMWS.verificarLogin(usuarioJson);
	}
	/**
	 * Este metodo permite actualizar los datos de un usuario determinado existente en la BD del servidor. 
	 * Basicamente es importante para actualizar el token del usuario al iniciar sesion en alguna aplicacion cliente.
	 * @param usuarioJson Recibe un String JSON encriptado.
	 * @return Retorna 1 si la actualizacion de usuario fue exitosa o 0 en caso contrario.
	 */
	public int updateUsuario(String usuarioJson){
		
		usuarioJson = EncriptarDesencriptar.desencriptarCaracteres(usuarioJson);
		
		return GestionUsuarioORMWS.updateUsuario(usuarioJson);
	}
}
